package main

import "fmt"

//defer 把它后面的语句延迟到函数即将返回的时候再执行
//    一个函数中可以有多个defer语句
//    多个defer语句按照栈的顺序(即先进后出)延迟执行
//defer 多用于函数结束之前释放资源(文件句柄、数据库连接、socket连接)
// func deferDemo(){
// 	fmt.Println("start")
// 	defer fmt.Println("嘿嘿")  //把它后面的语句延迟到函数即将返回的时候再执行
// 	defer fmt.Println("呵呵")
// 	defer fmt.Println("哈哈")
// 	fmt.Println("end")
// }
// func main(){
// 	deferDemo()
// }
func f1() int {
	x := 5
	defer func() {
		x++ //修改的是x，不是返回值
	}()
	return x //返回值=x=5
}
func f2() (x int) {
	defer func() {
		x++
	}()
	return 5 //1.返回值6
}
func f3() (y int) {
	x := 5
	defer func() {
		x++ //修改的是x
	}()
	return x //1.返回值=y=x=5
}
func f4() (x int) {
	defer func(x int) {
		x++ //改变的是函数中的副本
	}(x)
	return 5 //返回值=x=5
}
func f5() (x int) {
	defer func(x int) int {
		x++
		return x //没有变量接收返回的x,相当于丢弃了
	}(x)
	return 5 //返回值5
}

//传一个x的指针到匿名函数中
func f6() (x int) {
	defer func(x *int) {
		*x++ //修改直接修改了x的值
	}(&x) //将x的内存地址传进去了，
	return 5 //返回值6
}
func main() {
	fmt.Println(f1()) //5
	fmt.Println(f2()) //6
	fmt.Println(f3()) //5
	fmt.Println(f4()) //5
	fmt.Println(f5()) //5
	fmt.Println(f6()) //6
}
